//package com.guchenbo.example.lock;
//
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.locks.Condition;
//import java.util.concurrent.locks.ReentrantLock;
//
///**
// * @author guchenbo
// * @date 2022/3/23
// */
//public class ProductPool {
//
//  private ReentrantLock lock;
//  private Condition empty;
//  private Condition notEmpty;
//  private CreateThread createThread = new CreateThread();
//  private DestroyThread destroyThread = new DestroyThread();
//
//  private int init = 2;
//  private int min = 3;
//  private int max = 5;
//
//  private int activeCount;
//  private int poolCount;
//
//  public ProductPool() {
//    this.lock = new ReentrantLock();
//    this.empty = this.lock.newCondition();
//    this.notEmpty = this.lock.newCondition();
//    createThread.start();
////destroyThread.start();
//  }
//
//  public void init() {
//    lock.lock();
//    try {
//      if (init > 0) {
//        for (int i = 0; i < init; i++) {
//          poolCount++;
//        }
//      }
//    } catch (Exception e) {
//      e.printStackTrace();
//    } finally {
//      lock.unlock();
//    }
//  }
//
//  public void get() {
//    while (true) {
//      lock.lock();
//      try {
//        if (poolCount == 0) {
//          print("pool is empty");
//          empty.signal();
//          notEmpty.await();
//          print("pool is wakeup");
//          continue;
//        }
//        poolCount--;
//        activeCount++;
//        print("get" + (poolCount < 0));
//        break;
//      } catch (Exception e) {
//        e.printStackTrace();
//      } finally {
//        lock.unlock();
//      }
//    }
//  }
//
//  public int getActiveCount() {
//    return activeCount;
//  }
//
//  public void setActiveCount(int activeCount) {
//    this.activeCount = activeCount;
//  }
//
//  public int getPoolCount() {
//    return poolCount;
//  }
//
//  public void setPoolCount(int poolCount) {
//    this.poolCount = poolCount;
//  }
//
//  class CreateThread extends Thread {
//
//    @Override
//    public void run() {
//      while (true) {
//        lock.lock();
//        try {
//          if (poolCount + activeCount >= max) {
//            print("create full then wait");
//            empty.await();
//            print("create full  wakeup");
////            continue;
//          }
//          print("create");
//          Thread.sleep(1000);
//          poolCount++;
//          notEmpty.signal();
//        } catch (Exception e) {
//          e.printStackTrace();
//        } finally {
//          lock.unlock();
//        }
//      }
//    }
//  }
//
//  class DestroyThread extends Thread {
//
//    @Override
//    public void run() {
//      while (true) {
//        lock.lock();
//        try {
//          if (poolCount == 0) {
//            notEmpty.await();
//          }
//          print("destory");
//          poolCount--;
//          notEmpty.signal();
//        } catch (Exception e) {
//          e.printStackTrace();
//        } finally {
//          lock.unlock();
//        }
//      }
//    }
//  }
//
//  public static void print(Object object) {
//    System.out.println(Thread.currentThread().getName() + " -> " + object);
//  }
//
//  public static void main(String[] args) {
//    ExecutorService executor = Executors.newFixedThreadPool(10);
//
//    SessionSource source = new SessionSource();
//    source.init();
//
//    Thread thread = new Thread(() -> {
//      while (true) {
//        try {
//          executor.submit(() -> {
//            try {
//              source.get();
//              Thread.sleep(10000);
//              source.back();
//            } catch (Exception e) {
//              e.printStackTrace();
//            }
//          });
//          Thread.sleep(1000);
//
//        } catch (Exception e) {
//          e.printStackTrace();
//        }
//      }
//    });
//    thread.start();
//
//    new Thread(() -> {
//      while (true) {
//        print(source.getPoolCount() + "+" + source.getActiveCount() + "=" + (source.getPoolCount()
//            + source.getActiveCount()));
//
//        try {
//          Thread.sleep(3000);
//        } catch (InterruptedException e) {
//          e.printStackTrace();
//        }
//      }
//    }).start();
//
//  }
//
//  private void back() {
//    lock.lock();
//    try {
//      poolCount++;
//      activeCount--;
//      print("back");
//      notEmpty.signal();
//    } catch (Exception e) {
//      e.printStackTrace();
//    } finally {
//      lock.unlock();
//    }
//  }
//}
